#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int maxn = 1005;
int n, m;
int a, b, c, d;
char arr[maxn][maxn];
int color[maxn][maxn];

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
void dfs(int x, int y, int col){
	color[x][y] = col;
	// 四个方向进行染色
	for (int i=0;i<4;i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		// 没有越界, 没有染过色, 是道路
		if (nx >= 1 && nx <= n && ny >= 1 && ny <=m && arr[nx][ny] == '.' &&
			color[nx][ny] == 0) {
			dfs(nx, ny, col);
		}
	}
}

bool check(int x, int y){
	int num = 0;
	for (int i=0;i<4;i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		// 没有越界, 没有染过色, 是道路
		if (nx >= 1 && nx <= n && ny >= 1 && ny <=m && arr[nx][ny] == '.') {
			num |= color[nx][ny];
		}
	}
	return num == 3; // 只有一边的颜色为 1, 另一边为 2 即或上的结果为 3 最后才算打通
}

void solve(){
	cin >> n >> m;
	cin >> a >> b >> c >> d;
	for (int i=1;i<=n;i++) {
		for (int j=1;j<=m;j++) {
			cin >> arr[i][j];
		}
	}
	// 从起点能够到达的地方进行染色为 1
	dfs(a, b, 1);
	// 不要忘记本身就不用打通墙壁的情况, 即本身就能走到
	if (color[c][d] == 1) {
		cout << "Yes" << '\n';
		return;
	}
	// 从终点能够到达的地方进行染色为 2
	dfs(c, d, 2);
	for (int i=1;i<=n;i++) {
		for (int j=1;j<=m;j++) {
			if (arr[i][j] == '#') {
				if (check(i, j)) {
					cout << "Yes" << '\n';
					return ;
				}
			}
		}
	}
	cout << "No" << '\n';
	
}


signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
